package com.allen.flink.dbus.utils;

import com.allen.flink.dbus.config.GlobalConfig;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * jdbc通用的方法
 *
 */
public class JdbcUtil {
    //url
    private static String url = GlobalConfig.DB_URL;
    //user
    private static String user = GlobalConfig.USER_MAME;
    //password
    private static String password = GlobalConfig.PASSWORD;
    //驱动程序类
    private static String driverClass = GlobalConfig.DRIVER_CLASS;
    
    /**
     * 只注册一次，静态代码块
     */
    static {
        try {
            Class.forName(driverClass);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 获取连接方法
     */
    public static Connection getConn() {
        // 声明连接
        Connection conn = null;
        try {
            // 得到连接对象
            conn = DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
            // 异常处理
            System.err.println("连接失败!");
        }
        
        // 返回连接对象
        return conn;
    }
    
    /**
     * 释放资源的方法
     */
    public static void close(Statement stmt, Connection conn) {
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
    
    /**
     * 得到预处理器
     *
     * @param conn
     * @param sql
     *
     * @return
     */
    public static PreparedStatement getPreparedStatement(Connection conn, String sql) {
        
        // 声明预处理器对象
        PreparedStatement pstmt = null;
        try {
            // 得到预处理器对象
            pstmt = conn.prepareStatement(sql);
        } catch (SQLException e) {
            // 异常处理
            System.err.println("ִ执行sql失败!!!");
        }
        
        // 返回预处理器对象
        return pstmt;
    }
    
    /**
     * 增删改操作
     *
     * @param sql
     * @param obj
     *
     * @return
     */
    public static int execUpdate(PreparedStatement pstmt, String sql, Object[] obj) {
        
        // 得到预处理器
        pstmt = getPreparedStatement(getConn(), sql);
        
        // 声明结果
        int result = 0;
        
        // 进行操作
        for (int i = 1; i <= obj.length; i++) {
            
            try {
                // 传入参数
                pstmt.setObject(i, obj[i - 1]);
                
            } catch (SQLException e) {
                
                System.err.println("赋值失败!!!");
                
            }
        }
        
        try {
            // 执行SQL指令
            result = pstmt.executeUpdate();
        } catch (SQLException e) {
            System.err.println("执行SQL指令失败!!!");
        } finally {
            closeAll(getConn(), pstmt, null);
        }
        
        // 返回结果
        return result;
    }
    
    // 关闭结果集
    public static void closeResultSet(ResultSet rs) {
        
        // 判断结果集是否为空
        if (rs != null) {
            try {
                // 关闭结果集
                rs.close();
            } catch (SQLException e) {
                
                // 异常处理
                System.err.println("关闭结果集失败!");
            }
        }
    }
    
    /**
     * 关闭连接
     *
     * @param conn
     */
    public static void closeConn(Connection conn) {
        
        try {
            // 判断连接是否为空
            if (conn != null)
                // 关闭连接
                conn.close();
        } catch (SQLException e) {
            // 异常处理
            System.err.println("关闭连接失败!");
            
        }
        
    }
    
    /**
     * 关闭数据库资源
     *
     * @param conn
     * @param st
     * @param rs
     */
    public static void closeAll(Connection conn, Statement st, ResultSet rs) {
        
        // 关闭连接
        JdbcUtil.closeConn(conn);
        
        // 关闭结果集
        JdbcUtil.closeResultSet(rs);
    }
    
}

